#include<bits/stdc++.h>
using namespace std;
struct node{
    int d;
    int v;
    int a;
    int fin;
};
int total=0;
int n,m,L,V;
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++){
        scanf("%d%d%d%d",&n,&m,&L,&V);
        node c[n+5];
        int p[m+5];
        for(int j=0;j<n;j++){
            scanf("%d%d%d",&c[j].d,&c[j].v,&c[j].a);
            c[j].fin=0;
        }
        for(int j=0;j<m;j++){
            scanf("%d",&p[j]);
        }
        for(int j=0;j<n;i++){
            double t=0;
            if(c[j].v<=V){
                if(c[j].a>0){
                    t=(3-c[j].v)/c[j].a;
                    int s=c[j].v*t+0.5*c[j].a*t*t+c[j].d;
                    if(s<=L){
                        c[j].fin=s;
                    }else{
                        c[j].fin=INT_MAX;
                    }
                }else{
                    c[j].fin=INT_MAX;
                }
            }else{
                if(c[j].a>=0){
                    c[j].fin=L;
                }
                else{
                    t=(c[j].v-3)/c[j].a;
                    int sum=c[j].v*t+0.5*c[j].a*t*t;
                    if(sum>V){
                        c[j].fin=L;
                    }
                }
            }
        }
        for(int j=0;j<m;j++){
            for(int z=0;z<n;z++){
                if(c[z].fin+1<=p[j]){
                    total++;
                }
            }
        }
        int downsum=0,downt=0;
        for(int j=0;j<m;j++){
            for(int z=0;z<n;z++){
                if(c[z].fin+1<=p[j]){
                    downsum++;
                }
            }
            if(downsum==0){
                downt++;
            }
        }
        printf("%d %d",total,downt);
        //cout<<total<<" "<<downt;
        total=0;
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
